package com.doit.mr.day01;

import com.doit.mr.day01.MyUtil.MyUtils;
import org.apache.hadoop.fs.*;

import java.util.Arrays;
import java.util.List;

/**
 * @DATE 2021/12/7/19:37
 * @Author MDK
 * @Version 2021.2.2
 **/
public class C05_List {
    public static void main(String[] args) throws Exception {
        FileSystem fs = MyUtils.getFileSystem();
        //列出目录下的所有文件
        /* 参数一  指定路径
        *  参数二  是否为递归遍历  false
        *  结果是指定,目录下的所有文件
        * */
        RemoteIterator<LocatedFileStatus> listFiles = fs.listFiles(new Path("/"), false);
        while (listFiles.hasNext()){
            LocatedFileStatus file = listFiles.next();
            String name = file.getPath().getName();

        /* 获取文件的元数据信息
        *  LocatedFileStatus 存储在hdfs上的文件对象
        *  副本个数  物理切块大小
        *  文件名  文件大小  文件的切块个数
        *  文件每个切块所在的机器  文件每个切块的大小
        *  访问时间  修改时间
        * */
            short replication = file.getReplication();
            System.out.println(name+"副本的个数:"+replication+"个");
            long blockSize = file.getBlockSize();
            System.out.println(name+"文件的物理切块大小"+blockSize/1024/1024+"M");
            long len = file.getLen();
            System.out.println(name+"文件的实际大小"+len+"字节");

            //获取每个物理块所在的机器  每个文件块有三个副本
            BlockLocation[] blockLocations = file.getBlockLocations();
            for (BlockLocation blockLocation : blockLocations) {
                String[] hosts = blockLocation.getHosts();
                List<String> hostNames = (List<String>) Arrays.asList(hosts);
                //物理切块的实际长度及偏移量
                long length = blockLocation.getLength();
                long offset = blockLocation.getOffset();
                System.out.println(name+"物理块所在的主机"+hostNames+"-"+offset+"-"+length);
            }
        }

    }
}
